package org.az.netty_study.p04_netty初体验;

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringEncoder;

import java.net.InetSocketAddress;

/**
 * 演示netty作为客户端给服务器发送消息
 */
public class HelloClient {
    public static void main(String[] args) throws InterruptedException {
        /**
         * 1.客户端的启动器，作用跟服务端的启动器ServerBootstrap一样
         */
        Bootstrap client = new Bootstrap();
        /**
         * 2.添加EventLoopGroup
         */
        client.group(new NioEventLoopGroup());
        /**
         * 3.设置客户端的SocketChannel实现
         */
        client.channel(NioSocketChannel.class);
        /**
         * 4.添加ChannelHandler，同服务器端的ChannelHandler，都是连接建立后执行的操作
         */
        client.handler(
                new ChannelInitializer<NioSocketChannel>() {
                    @Override
                    protected void initChannel(NioSocketChannel ch) throws Exception {
                        /**
                         * 5.给NioSocketChannel通道添加一具体的handler，将来连接建立后发送/接收消息时，会依次回调
                         */
                        //StringEncoder同样是netty提供的，将发送的字符串转为字节写入channel
                        ch.pipeline().addLast(new StringEncoder());
                    }
                }
        );
        /**
         * 6.连接到服务器
         */
        ChannelFuture connect = client.connect(new InetSocketAddress("localhost", 9001));

        /**
         * 7.开始发送数据，connect.sync()是一个阻塞方法，表示只有当连接建立后，才往下运行
         */
        connect = connect.sync();
        //执行到这，说明连接建立了，得到连接的channel，往里面写数据(从字符串最终写入到channel之前，会依次回调上面添加的handler)
        connect.channel().writeAndFlush("hello server");
        connect.channel().closeFuture();
    }
}
